package LoginServer;

import Library.Login.*;
import java.rmi.*;
import java.rmi.server.*;
import java.security.NoSuchAlgorithmException;
import java.util.*;

/**
 * Ticket is een bewijs dat er is ingelogd op de loginserver
 * deze ticket wordt gebruikt als bewijs voor de gameserver.
 * De ticket dient als validatie dat er met succes is ingelogd.
 * De gameserver controleert de ticket met de database.
 */
public class Ticket extends UnicastRemoteObject implements ITicket
{
    /**
     *
     */
    protected Map<String, String> m_GameServers;
    /**
     *
     */
    protected transient String m_Token;
    /**
     *
     */
    protected String m_Username;
    
    /**
     * Generator voor Tokens.
     */
    protected static Random m_TokenGenerator = new Random();
    
    /**
     * maakt een nieuw ticket aan voor de account die zich aanmeldt op een
     * gameserver
     * @param account
     * @param servers
     * @throws RemoteException
     * @throws NoSuchAlgorithmException
     */
    public Ticket(Account account, Map<String, String> servers)
            throws RemoteException, NoSuchAlgorithmException
    {
        m_Username = account.getUsername();
        m_GameServers = servers;
        m_Token = Long.toHexString(m_TokenGenerator.nextLong()) + Long.toHexString(m_TokenGenerator.nextLong());
    }

    /**
     * geeft een lijst met de gameservers terug
     * @return lijst met gameservers
     * @throws RemoteException
     */
    public Map<String, String> getGameServers() throws RemoteException
    {
        return m_GameServers;
    }

    /**
     * Geeft de username terug
     * @return username
     * @throws RemoteException
     */
    public String getUsername() throws RemoteException
    {
        return m_Username;
    }
    
    /**
     * Geeft het token terug
     * @return token
     * @throws RemoteException
     */
    public String getToken() throws RemoteException
    {
        return m_Token;
    }
    
    /**
     * @see java.lang.Object#equals(java.lang.Object)
     */
    @Override
    public boolean equals(Object obj)
    {
	if (this == obj)
	    return true;
	if (obj == null)
	    return false;
	if (getClass() != obj.getClass())
	    return false;
	ITicket ticket = (ITicket)obj;
	
	try
	{
	    return ticket.getUsername().equals(getUsername());
	}
	catch (RemoteException ex)
	{
	    ex.printStackTrace();
	}
	return false;
    }
    
    /**
     * @see java.lang.Object#hashCode()
     */
    @Override
    public int hashCode()
    {
	return m_Username.hashCode();
    }
}